package com.demo.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;

import java.util.Date;
import java.util.Objects;

/**
 * redis分布式锁
 * */

@Controller
public class RedisLock {


    @Autowired
    public RedisTemplate redisTemplate;


    //加锁

    public boolean lock(String key , String value){
        // 首次枷锁，当key不存在是我们进行set操作，若key已经存在则不做任何操作
        if (redisTemplate.boundValueOps(key).setIfAbsent(value)){
            return true;
        }
        //避免锁超时而导致死锁问题
        String oldValue = (String) redisTemplate.boundValueOps(key).get();
        if (StringUtils.isNoneBlank(oldValue) && Long.parseLong(oldValue) < new Date().getTime()){
            // 取旧赋新
            String oldValue2 = (String) redisTemplate.boundValueOps(key).getAndSet(value);
            if (Objects.equals(oldValue , oldValue2)){
                return true;
            }
        }
        return false;
    }


    //解锁

    public boolean unlock(String key , String value){
        try {
            String oldValue = (String) redisTemplate.boundValueOps(key).get();
            if (Objects.equals(oldValue,value)){
                redisTemplate.delete(key);
            }
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}
